/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ RegistroVenta.java
 * Universidad de los Andes (Bogota - Colombia)
 * Departamento de Ingenieria de Sistemas y Computacion
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: German Sotelo
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.entities;

import java.io.Serializable;
import javax.persistence.ColumnResult;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;

/**
 * Clase que modela un registro de venta realizado a traves de la interfaz web de MLA.
 * @author German Sotelo
 */
@Entity
@Table(name = "RegistroVenta")
@SqlResultSetMappings({
    @SqlResultSetMapping(name = "RegistroVenta.rtaFindByDateRange", columns = {@ColumnResult(name = "fechaVenta"), @ColumnResult(name = "valorCompra"), @ColumnResult(name = "referencia"), @ColumnResult(name = "nombre")})
})
@NamedNativeQueries({
    @NamedNativeQuery(name = "RegistroVenta.findByDateRange", query = "SELECT r.fechaVenta, (r.cantidad * m.precio) AS valorCompra, m.referencia, m.nombre " +
                                                                      "FROM RegistroVenta r, Mueble m " +
                                                                      "WHERE r.fechaVenta BETWEEN :fechaInicio AND :fechaFin " +
                                                                      "ORDER BY R.fechaVenta DESC")
})
@NamedQueries({
    @NamedQuery(name = "RegistroVenta.findAll", query = "SELECT r FROM RegistroVenta r"),
    @NamedQuery(name = "RegistroVenta.findByUser", query = "SELECT r FROM RegistroVenta r WHERE r.comprador.documento = :documento ORDER BY R.registroVentaPK.fechaVenta")
})
public class RegistroVenta implements Serializable{

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private RegistroVentaPK registroVentaPK;

    /**
     * Producto vendido
     */
    @JoinColumn(name = "referencia", referencedColumnName = "referencia", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Mueble producto;

    /**
     * Cantidad vendida del producto
     */
    private int cantidad;

    /**
     * Ciudad en la que se vendió el producto
     */
    private String ciudad;

    /**
     * Usuario que compró el producto
     */
    @JoinColumn(name = "usuario", referencedColumnName = "documento", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Usuario comprador;

    public int getCantidad() {
        return cantidad;
    }

    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    public Mueble getProducto() {
        return producto;
    }

    public void setProducto(Mueble producto) {
        this.producto = producto;
    }

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }

    public Usuario getComprador() {
        return comprador;
    }

    public void setComprador(Usuario comprador) {
        this.comprador = comprador;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getRegistroVentaPK() != null ? getRegistroVentaPK().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof RegistroVenta)) {
            return false;
        }
        RegistroVenta other = (RegistroVenta) object;
        if ((this.getRegistroVentaPK() == null && other.getRegistroVentaPK() != null) || (this.getRegistroVentaPK() != null && !this.registroVentaPK.equals(other.registroVentaPK))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.losalpes.catalogo.entities.RegistroVenta[registroVentaPK=" + getRegistroVentaPK() + "]";
    }

    /**
     * @return the registroVentaPK
     */
    public RegistroVentaPK getRegistroVentaPK() {
        return registroVentaPK;
    }

    /**
     * @param registroVentaPK the registroVentaPK to set
     */
    public void setRegistroVentaPK(RegistroVentaPK registroVentaPK) {
        this.registroVentaPK = registroVentaPK;
    }
}
